3
תגובות
הוקסמתי מהדרך שלא צריך ליצור אינסטנט חדש למחלקה... ועכשיו כל עבודה שלי מתבצעת עם סטטיות בלבד..

אני מרגיש שאני מפספס משהו..ואולי עף על יותר מידי זכרון

אפשר קצת סדר מתי להגדיר פונקציה סטטית פומבית פרטית וכו'...



סטטית תשמר לכל אורך הפעלת הסקריפט?אודה למי שיוכל להרחיב בנושא

3 תשובות

avatar ענה intval ב 12 ליוני 2012 #

לא ממש.
סטטית - אומר משותפת לכל המופעים של המחלקות האלה.
סטטי - שייך למחלקה, לא למופע.

במקרה של המחלקה בן אדם על כדור הארץ:
יש מופעים ספצייפיים, אלכס, איתמר, אילן וכו' לכל אחד מהם יש תכונות משלו, תכונות של המופע.
אמנם לפעמים יש תכונות של המחלקה / של הסוג. לסוג קוראים homosapiens. זה לא תכונה של איתמר ולא של אלכס. זה תכונה של כל הסוג כולו. תכונה כזאת מסמנים במילה static.

לפעמים זה אפילו אומר פחות זכרון, כי עכשיו במקום לשמור 20 פעמים אותו משתנה עבור כל מופע - יש לך רק מקום אחד בזיכרון תפוס.

אתה צודק לגמרי - יש אבל אחד.
יש מעט מאוד מחלקות שבכלל אמורות להיות סטטיות.
קישור למסד נתונים, אולי משהו לכתיבת לוגים ולא הרבה יותר מזה. מחלקות שצריך להיות רק אחת מהן לאורך כל התוכנה.

מחלקות באות לייצג עצמים, גופים, אובייקטים, דברים, יחידות של משהו. תקרא לזה איך שאתה רוצה. בדרך כלל אין שום דבר משותף לעצמים. אין דבר כזה יוזר שיש לו משהו משותף עם יוזר אחר.

לכל יוזר יש שם משלו, סיסמה משלו, גיל משלו. אין שום דבר משותף ביניהם ואין שום סיבה שיהיה משהו סטטי במחלקה הזאת.
במקרים מסוימים כן יש לכל היוזרים משהו משותף, לדוגמה משתנים משותפים.
אם יש ליוזר שלך פעולה GetName שצריכה להחזיר לך את השם של המשתמש לאחר ששלפה אותו מהמסד, הגיוני ששם הטבלה שממנה כולם ישלפו את הנתונים יהיה משותף לכל המופעים.
זה לא שיוזר אחד לוקח את השם שלו מטבלה אחת, היוזר האחר מטבלה אחרת. כאן אפשר לסמן את המשתנה הזה בתור סטטי (למרות שעדיף בכלל בתור קבוע) ואז לחסוך קצת בזיכרון. ככה זה יהיה שייך לטיפוס "יוזר" ולא למופע "אלכס".

כמות המקרים שהשימוש בסטטי הינו מוצדק מאוד נמוכה. כמות המקרים שבהם השימוש בסטטי הוא לא נכון הרבה יותר גדולה.
בגלל זה בדרך כלל עדיף להימנע משימוש בסטטי עד כמה שאפשר הנא דוגמה:

נניח שיש לך מופע של יוזר אלכס ומופע של יוזר איתמר.
עכשיו גולש הגיע לאתר שלך ואתה רוצה לזהות אותו לפי הקוקי. אתה תכתוב פעולה בשם GetUserByCookie ותשים אותה איפשהו. כנראה שבתוך המחלקה יוזר.

אם לא תסמן אותה בתור סטטית - זו תהיה פעולה של מופע מסוים.
של איתמר למשל. אבל לאיתמר, מבחינה הגיונית, לא אמורה להיות פעולה בשם "קבל יוזר מקוקי". מה יש לו לקבל יוזר מקוקי אם הוא כבר איתמר?
בגלל זה הגיוני יותר לעשות אותה בתור פעולה סטטית של המחלקה ולא בתור פעולה של מופע מסוים.

עד כאן הדוגמה בטח נראית מאוד הגיונית.
הבעיה היחידה היא שהיא לא נכונה.

הפעולה GetUserByCookie היא לא פעולה על אובייקט מסוים. ואתה זוכר ש OOP בתכנון רוצים שפשוט יהיו לך מופעים של דברים ורק מופעים של דברים. בגלל שלא הגיוני שלאיתמר תהיה פעולה "לקבל משתמש לפי קוקי" הפעולה הזאת לא אמורה להיות שייכת בכלל למחלקת היוזר.

המקום הנכון בשבילה איהיה ליצור מחלקה בשם authenticator
שבה תהיה הפעולה הזו ובטח עוד פעולה של לקבל יוזר לפי שם משתמש וסיסמה שניצור מופע שלה ונשתמש בפועולות שלה בשביל הזדהות.

ככה שלסיכום:
פעולות סטטיות בתוך מחלקות מעידות על זה - שהם פשוט נמצאות במחלקה הלא נכונה ומשהו לא בסדר.
משתנים סטטים יכולים להיות — אבל בכל מקום שבו יכול להיות משתנה סטטי כנראה אמור להיות בכלל קבוע. ככה שגם הם לא אמורים להיות.
ככה שהשימוש בסטטי נשאר רק במקרים של סינגלטונים. ואם יש איפשהו במקום אחר בתוכנה משהו סטטי - כנראה שהמבנה שלה לא נכון.
והדרך היחידה להחליט על מבנה נכון זה נסיון.

avatar ענה משתמש_239411 ב 14 ליוני 2012 #

וואו אין מילים תודה

avatar ענה intval ב 14 ליוני 2012 #

בכיף :)